<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>VPatch 2</title>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
<style type="text/css">
/*<![CDATA[*/

body
        {
        padding: 10px;
        background-color: #F0F0F0;
        font-family: Verdana, Arial, Helvetica, sans-serif;
        font-size: 13px;
        font-weight: normal;
        text-align: left;
        }

p, li
        {
        font-size: 13px;
        }

.center
        {
        text-align: center;
        }

table
        {
        margin: auto;
        font-size: 13px;
        background-color: #FFFFFF;
        }

.maintable
        {
        border: 2px solid #376EAB;
        }

.parameter
        {
        font-weight: bold;
        color: #6586AC;
        }


h1
        {
        font-size: 30px;
        color: #333333;
        font-weight: normal;
        text-align: center;
        margin-top: 20px;
        }

h2
        {
        font-size: 20px;
        color: #7A7272;
        font-weight: normal;
        }

h3
        {
        font-size: 17px;
        font-weight: bold;
        color: #303030;
        }

pre     {
	font-size: 13px;
        }

div
        {
        margin: 20px;
        }

a:link, a:visited, a:active
        {
        color: #294F75;
        text-decoration: none;
        }

a:hover
        {
        color: #182634;
        text-decoration: underline;
        }

/*]]>*/
</style>
</head>
<body>
<table width="750" class="maintable" cellspacing="0" cellpadding="0" align="center">
    <tr> 
      <td> 
        <h1>VPatch 2</h1>
        <div> 
          <h2>Introduction</h2>
          <div>
          <p>VPatch allows to create a patch file to update previous versions 
            of your software. The GenPat utitily generates the patch file. The 
            plug-in can use the patch to update a file. Using a patch, you can 
            reduce the download size of your updates, because only the differences 
            between the files are included in the patch file.</p>
          </div>
          <h2>How to use</h2>
          <div>
          <h3>Generate the patch file</h3>
          <div>
          <p>Make sure you have the source file (original version) and the target 
            file (version to update to). For example, DATA.DTA (currently on user 
            system) and DATA_20.DTA (version 2.0 of this data file). Now call 
            the command line tool GenPat.exe:</p>
          <pre>
GENPAT data.dta data_20.dta data.pat
</pre>
          <p>Now, the patch will be generated, this will take some time.</p>
          <p>Using the /B=(BlockSize) parameter of the GenPat utility (put it 
            after the filenames), you can use a different block size. A smaller 
            block size may result in a smaller patch, but the generation will 
            take more time (the default blocksize is 64).</p>
          </div>
          <h3>Update the file during installation</h3>
          <div>
          <p>Use the VPatch plug-in to update a file using a patch file:</p>
          <pre>
vpatch::vpatchfile "pathfile.pat" "source.file" "new.file"
</pre>
          <p>The result of the patch operating will be added to the stack and 
            can be one of the following texts:</p>
          <ul>
            <li>OK</li>
            <li>OK, new version already installed</li>
            <li>An error occured while patching</li>
            <li>Patch data is invalid or corrupt</li>
            <li>No suitable patches were found</li>
          </ul>
          <p>Check <a href="example.nsi">example.nsi</a> for an example.</p>
          </div>
          <h3>Multiple patches in one file</h3>
          <div>
          <p>GenPat appends a patch to the file you specified. If there is already 
            a patch for the same orginal file in the patch file, the patch will 
            be replaced. For example, if you want to be able to upgrade version 
            1 and 2 to version 3, you can put a 1 &gt; 3 and 2 &gt; 3 patch in 
            one file.</p>
          <p>You can also put patches for different files in one patch file, for 
            example, a patch from file A version 1 to file A version 2 and a patch 
            from file B version 1 to file B version 2. Just call the plug-in multiple 
            times with the same patch file. It will automatically select the right 
            patch (based on the file CRC).</p>
          </div>
          <h3>GenPat exit codes</h3>
          <div>
          <p>In version 2.1 support was added for exit codes (known as error levels 
            in the DOS period) to GenPat. GenPat will return an exit code based 
            on succes of the patch generation. Here is a list of the possible 
            exit codes:</p>
          <table width="547" border="0" cellspacing="0" cellpadding="0">
            <tr> 
              <td><b>Exit code</b></td>
              <td><b>Description</b></td>
            </tr>
            <tr> 
              <td>0</td>
              <td>Success</td>
            </tr>
            <tr> 
              <td>1</td>
              <td>Arguments missing</td>
            </tr>
            <tr> 
              <td>2</td>
              <td>Source file not found</td>
            </tr>
            <tr> 
              <td>3</td>
              <td>Target file not found</td>
            </tr>
            <tr> 
              <td>4</td>
              <td>Unknown error while reading existing patch file</td>
            </tr>
            <tr> 
              <td>5</td>
              <td>Unknown error while generating patch</td>
            </tr>
            <tr> 
              <td>6</td>
              <td>Unknown error while writing patch file to disk</td>
            </tr>
            <tr> 
              <td>10</td>
              <td>CRC of source and target file are equal</td>
            </tr>
            <tr> 
              <td>11</td>
              <td>Not enough memory for source file</td>
            </tr>
			<tr> 
              <td>12</td>
              <td>Not enough memory for target file</td>
            </tr>
          </table>
          <p>These exit codes can be useful when you generate patch files through 
            a script.</p>
        </div>
        </div>
        </div>
        <div>
          <h2>Source code</h2>
          <div>
          <h3>NSIS plug-in (C++)</h3>
          <div>
          <p>The source of the NSIS plug-in that applies patches can be found 
            in the Source\Plugin folder.</p>
          </div>
          <h3>Patch Generator (Delphi)</h3>
          <div>
          <p>The most interesting part of VPatch, the actual patch generation 
            algoritm, can be found in Source\GenPat\PatchGenerator.pas. The header 
            of that file contains a brief explanation of the algoritm as well.</p>
          </div>
          <h3>User interface (Delphi)</h3>
          <div>
          <p>A user interface is included as well, which you will have to build 
            yourself because the GUI executable was too large to include. Besides 
            Borland Delphi 6 or higher (you can use the freely available Personal 
            edition), you will also need to install the <a href=
"http://www.delphi-gems.com">VirtualTreeView</a> component by Mike Lischke.</p>
          </div>
          </div>
          <h2>Version history</h2>
          <div>
          <ul>
            <li>2.1 
              <ul>
                <li>Added argument checking and error handling to GenPat. Now 
                  returns exit codes as well to indicate success/failure (and 
                  the reason for failure). Only GenPat has changed in this version 
                  compared to 2.0 final.</li>
                <li>Bug Fix: GenPat no longer gives an Access Violation when attempting 
                  to patch a file smaller than 64 bytes into a file larger than 
                  64 bytes.</li>
              </ul>
            </li>
            <li>2.0 final 
              <ul>
                <li>Cleaned up source code for the patch generator, which is now 
                  included (this code is written in Borland Delphi 6 and compiles 
                  with the freely available Personal edition).</li>
              </ul>
            </li>
            <li>2.0 beta 2 
              <ul>
                <li>All new algorithm used in the patch generator: much faster 
                  (up to 90%) while using smaller block sizes (higher compression)</li>
                <li>Created a NSIS 2 plugin</li>
                <li>Works with small files</li>
                <li>Replaces existing patch in file if original file CRC is identical</li>
              </ul>
            </li>
          </ul>
          </div>
          <h2>Credits</h2>
          <div>
          <p>Written by Koen van de Sande<br />
            C plug-in by Edgewize<br />
            New documentation and example by Joost Verburg</p>
          </div>
          <h2>License</h2>
          <div>
          <pre>
Copyright (C) 2001-2003 Koen van de Sande

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute
it freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; 
   you must not claim that you wrote the original software.
   If you use this software in a product, an acknowledgment in the
   product documentation would be appreciated but is not required.
2. Altered versions must be plainly marked as such,
   and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any distribution.
</pre>
</div>
        </div>
      </td>
</tr>
</table>
</body>
</html>
